package com.leyou.cart.service;

import com.leyou.auth.entiy.UserInfo;
import com.leyou.cart.filter.LoginInterceptor;
import com.leyou.cart.pojo.Cart;
import com.leyou.common.utils.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

//这里把数据存入Redis 而不是数据库
@Service
public class CartService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    //存入Redis数据的前缀，为了避免key值重复导致数据被覆盖
    private static final String KEY_PREFIX = "ly:cart:uid:";

    //日志记录
    private static Logger logger = LoggerFactory.getLogger(CartService.class);

    //添加商品到购物车，存入Redis
    //购物车结构是一个双层Map：Map<String,Map<String,String>>
    //- 第一层Map，Key是用户id
    //- 第二层Map，Key是购物车中商品id，值是购物车数据
    public void addCart(List<Cart> carts) {
        //获取登录用户
        UserInfo userInfo = LoginInterceptor.getLoginUser();
        //Redis中的Key使用当前登录用户的uid
        String key = KEY_PREFIX + userInfo.getId();

        //获取Redis中hash操作对象
        BoundHashOperations<String, Object, Object> ops = this.redisTemplate.boundHashOps(key);
        //查询是否存在数据

        carts.forEach(cart -> {
            Long skuId = cart.getSkuId();
            Integer num = cart.getNum();
            Boolean bool = ops.hasKey(skuId.toString());
            if (bool) {
                //如果存在数据，则修改购物车中商品的数量即可
                String json = ops.get(skuId.toString()).toString();
                Cart cartOld = JsonUtils.parse(json, Cart.class);//将查询出来的数据转成json格式
                //修改商品数量
                cart.setNum(cartOld.getNum() + num);
            } else {
                //如果不存在数据，则新增商品到redis中
                //将用户的id添加到cart对象中
                cart.setUserId(userInfo.getId());
            }

            //最后把最新的cart数据写入redis中
            ops.put(cart.getSkuId().toString(), JsonUtils.serialize(cart));
        });
    }

    //登录状态下查询购物车
    public List<Cart> queryCarts() {
        //查询登录用户
        UserInfo loginUser = LoginInterceptor.getLoginUser();
        //判断是否有购物车
        String key = KEY_PREFIX + loginUser.getId();
        Boolean bool = this.redisTemplate.hasKey(key);
        if (bool == false) {
            //购物车不存在，则直接返回，不做其他操作
            return null;
        }
        //若用户存在购物车，则接着判断其中是否有数据
        BoundHashOperations<String, Object, Object> ops = this.redisTemplate.boundHashOps(key);
        //取出其中的数据,并进行判断其中是否有数据
        List<Object> carts = ops.values();
        if (CollectionUtils.isEmpty(carts)) {
            return null;
        }
        //将数据取出并返回
        List<Cart> list = carts.stream()
                .map(cart -> JsonUtils.parse(cart.toString(), Cart.class)).collect(Collectors.toList());
        return list;
    }

    //修改商品数量
    public void updateCart(Long skuId, Integer num) {
        //查询登录用户的信息
        UserInfo loginUser = LoginInterceptor.getLoginUser();
        String key = KEY_PREFIX + loginUser.getId();
        BoundHashOperations<String, Object, Object> ops = this.redisTemplate.boundHashOps(key);
        //获取购物车中指定skuId的商品
        String json = ops.get(skuId.toString()).toString();
        Cart cart = JsonUtils.parse(json, Cart.class);
        cart.setNum(num);
        //把修改后的商品再次写入购物车
        ops.put(skuId.toString(), JsonUtils.serialize(cart));
    }

    //删除商品
    public void deleteCart(String skuId) {
        //查询用户信息
        UserInfo loginUser = LoginInterceptor.getLoginUser();
        String key = KEY_PREFIX + loginUser.getId();
        BoundHashOperations<String, Object, Object> ops = this.redisTemplate.boundHashOps(key);
        //删除指定skuId的商品
        ops.delete(skuId);
    }
}
